/**
* 
* 
*  
*====================================================
* 文件名称: InterceptorStack.java
* 修订记录：
* No    日期				作者(操作:具体内容)
* 1.    2009-7-7			
*====================================================
* 类描述：(说明未实现或其它不应生成javadoc的内容)
* 
*/
package com.devframe.web.interceptors;

import java.util.ArrayList;
import java.util.List;

import com.devframe.web.MyAction;
import com.devframe.web.MyContext;
import com.devframe.web.Struts1BaseAction;
import com.devframe.web.Struts2BaseAction;


/**
 *<pre><b><font color="blue">InterceptorStack</font></b></pre>
 *
 *<pre><b>&nbsp;--空拦截器栈--</b></pre>
 * <pre>用于集中配置多个拦截器组合，拦截器栈用于简化拦截器配置
 * 系统将依次执行before事件，逆序执行after事件。即拦截器是嵌套的。
 * <pre>
 * <b>--样例--</b>
 *   InterceptorStack obj = new InterceptorStack();
 *   obj.method();
 * </pre>
 * JDK版本：JDK1.4
 * @author  <b></b> 
 */
public class InterceptorStack implements MyInterceptorStack {
    /**
     * interceptors
     * 配置的多个拦截器
     */
    private List interceptors = new ArrayList();
    /**
     * struts1的拦截器
     */
    private List struts1Interceptors =new ArrayList();
    /**
     * struts2的拦截器
     */
    private List struts2Interceptors=new ArrayList();

    /**
     * 拦截器的before事件
     * @param context 上下文
     * @param action action类实例
     * @param method 调用方法
     * 
     */
    public void before(MyContext context, MyAction action) {
        int len = interceptors.size();
        //公共的拦截器
        for(int i=0;i<len;i++){
            MyInterceptor inter = (MyInterceptor)interceptors.get(i);
            inter.before(context, action);
        }
        //strus1的拦截器
        if(action instanceof Struts1BaseAction) {
        	len=struts1Interceptors.size();
            for(int i=0;i<len;i++){
                MyInterceptor inter = (MyInterceptor)struts1Interceptors.get(i);
                inter.before(context, action);
            }	
        }else if(action instanceof Struts2BaseAction){//struts2的拦截器
        	len=struts2Interceptors.size();
            for(int i=0;i<len;i++){
                MyInterceptor inter = (MyInterceptor)struts2Interceptors.get(i);
                inter.before(context, action);
            }	
        }
        
    }
    
    /**
     * 后处理逻辑，逆序执行
     * @param context 上下文
     * @param action action类实例
     * @param result action返回值
     * 
     */
    public void after(MyContext context, MyAction action,Object result) {
        int len = interceptors.size();
        for(int i=len-1;i>=0;i--){
            MyInterceptor inter = (MyInterceptor)interceptors.get(i);
            inter.after(context, action ,result);
        }
        //struts1
        if(action instanceof Struts1BaseAction){
	        len = struts1Interceptors.size();
	        for(int i=len-1;i>=0;i--){
	            MyInterceptor inter = (MyInterceptor)struts1Interceptors.get(i);
	            inter.after(context, action ,result);
	        }
        }
        //struts2
        if(action instanceof Struts2BaseAction){
	        len = struts2Interceptors.size();
	        for(int i=len-1;i>=0;i--){
	            MyInterceptor inter = (MyInterceptor)struts2Interceptors.get(i);
	            inter.after(context, action ,result);
	         }
        }
    }

	

	/**
     * 加入拦截器
     * @param interceptor 拦截器
     * 
     */
    public void addInterceptor(MyInterceptor interceptor){
        interceptors.add(interceptor);
    }
    
    /**
     * setInterceptors 注入拦截器列表
     * @param interceptors interceptors
     * 
     */
    public void setInterceptors(List interceptors){
        this.interceptors=interceptors;
    }

    /**
     * 获取配置的拦截器
     * @return 拦截器列表
     * 
     */
    public List getInterceptors() {
        return interceptors;
    }

	public List getStruts1Interceptors() {
		return struts1Interceptors;
	}

	public void setStruts1Interceptors(List struts1Interceptors) {
		this.struts1Interceptors = struts1Interceptors;
	}

	public List getStruts2Interceptors() {
		return struts2Interceptors;
	}

	public void setStruts2Interceptors(List struts2Interceptors) {
		this.struts2Interceptors = struts2Interceptors;
	}


    
}
